在 Swift 中,Enumeration 可以把數個例子集合起來,作為是一種型別,每一個例子可能代表著一種情境,Enumeration 的每一個例子都允許有 Raw Value,作為初始值,透過宣告型別的方式,決定 Raw Value 的型別為何。
enum 列舉 {
case 列舉案例1
case 列舉案例2
.
.
}
透過 enum
作為開頭,為你的列舉命名,這裡的命名方式就跟一般常數變數命名有些不同,有幾個要注意的地方:
在《 Day 14 | Swift 流程控制:If 和 Switch 》的 冷知識 1:Switch 的使用必須是 exhaustive 段落中,有使用到一個 Enumeration:
enum Animals {
case dog
case cat
case bird
}
建立一個 Animals
的 Enumeration,列舉了三個案例,這個就是最簡單的列舉方式。
至於 Enumerations 的使用方式會像是這樣:
列舉.列舉案例1
列舉.列舉案例2
所以我們想找到 Animals 中的 dog 案例,就可以這麼寫:
Animals.dog
為什麼在《 Day 14 | Swift 流程控制:If 和 Switch 》中,使用 Switch-Case
時,不用加上 Animals 就可以直接使用 .dog
或是 .cat
?
let animals: Animals = Animals.dog
switch animals {
case .dog:
print("這是狗")
case .cat:
print("這是貓")
case .bird:
print("這是鳥")
}
因為我們在編譯的時候,就會透過型別推斷,知道這是一個 Animals 的 Enumeration,所以在指派新的值或是使用
Switch-Case
時,就可以省略列舉的名稱。
在建立Enumerations 時,可以宣告案例的型別為何,使用方法如下:
enum 列舉: 案例原始值型別 {
case 列舉案例1 = RawValue
case 列舉案例2 = RawValue
.
.
}
在列舉後方加上 : 型別
,可以用來宣告 Raw Value 的型別,但是只能儲存宣告時的型別,不允許其他型別的資料存入。
然而 Raw Value 的型別只能接受以下這幾個型別:
enum Animals: String {
case dog = "可愛狗狗"
case cat = "憤怒貓貓"
case bird = "興奮鳥鳥"
}
宣告 Animals 的 Case 可以有字串型別的初始值,在使用上就可以這樣使用:
列舉.列舉案例.rawValue
print(Animals.bird.rawValue) // 興奮鳥鳥
你可以將多個 case 用 ,
隔開不同的 case ,把他們全部寫在同一行。
enum Animals {
case dog, cat, bird
}
Enumerations 相關值,有了相關值,我們就可以透過這個來讀取外部的資料,我們來看下面這個範例:
enum Gender {
case male
case female
}
enum People {
case name(_ name: String)
case age(_ age: Int)
case gender(_ gender: Gender)
}
相關值使用方式很像參數的宣告,每一個 case 都有一個附加情境,你可以自己選擇想要的參數數量及型別,同時也可以自定義一個 Enumeration,作為參數型別來使用。
Associated Values 允許不同 case 使用不同的型別,在使用上沒變,就依照你所設定的參數型別來輸入對應型別的資料:
let name = People.name(firstName: "安竹", lastName: "皮皮")
let age = People.age(23)
let gender = People.gender(.male)
可以使用 Switch-Case
的方式來取用 Associated Values:
let people: People = .name(firstName: "安竹", lastName: "皮皮")
switch people {
case .name(firstName: let firstName, lastName: let lastName):
print("你的姓名是 \(firstName + lastName)")
case .age(let age):
print("你的年齡是 \(age) 歲")
case .gender(let gender):
print(gender)
}
// Prints: 你的姓名是 安竹皮皮
Associated Values 可用來操作外部的資料,Enumeration 又可當作一個特殊型別,在分類上也會更好理解或是使用上更容易上手,更直覺一點,讓 Enumeration 功能更強大許多。
感謝分享,補充 indirect enum
https://www.hackingwithswift.com/example-code/language/what-are-indirect-enums
雖然平常用不太到,不過可以看看
謝謝 ytyubox 大大幫忙補充!